Date and Time Functions
Table of Contents
- GETDATE | Date Values
- Date Part Extractions (DATETRUNC, DATENAME, DATEPART, YEAR, MONTH, DAY)
- DATETRUNC β Data Aggregation
- EOMONTH
- Date Parts | Use Cases
- FORMAT
- CONVERT
- CAST
- DATEADD / DATEDIFF
- ISDATE
1. GETDATE | Date Values
Task 1 β Display order dates and current system date
Display OrderID, CreationTime, a hard-coded date '2025-08-20' as HardCoded, and the current system date as Today using GETDATE() from Sales.Orders.
π‘ Suggested Answers
SELECT
OrderID,
CreationTime,
'2025-08-20' AS HardCoded,
GETDATE() AS Today
FROM Sales.Orders;
2. Date Part Extractions (DATETRUNC, DATENAME, DATEPART, YEAR, MONTH, DAY)
Task 2 β Extract multiple date parts from CreationTime
For each order, extract different parts of CreationTime using:
DATETRUNCfor year, day, and minuteDATENAMEfor month, weekday, day, yearDATEPARTfor year, month, day, hour, quarter, weekYEAR,MONTH,DAY
Return all of these in a single query.
π‘ Suggested Answers
SELECT
OrderID,
CreationTime,
-- DATETRUNC Examples
DATETRUNC(year, CreationTime) AS Year_dt,
DATETRUNC(day, CreationTime) AS Day_dt,
DATETRUNC(minute, CreationTime) AS Minute_dt,
-- DATENAME Examples
DATENAME(month, CreationTime) AS Month_dn,
DATENAME(weekday, CreationTime) AS Weekday_dn,
DATENAME(day, CreationTime) AS Day_dn,
DATENAME(year, CreationTime) AS Year_dn,
-- DATEPART Examples
DATEPART(year, CreationTime) AS Year_dp,
DATEPART(month, CreationTime) AS Month_dp,
DATEPART(day, CreationTime) AS Day_dp,
DATEPART(hour, CreationTime) AS Hour_dp,
DATEPART(quarter, CreationTime) AS Quarter_dp,
DATEPART(week, CreationTime) AS Week_dp,
YEAR(CreationTime) AS Year,
MONTH(CreationTime) AS Month,
DAY(CreationTime) AS Day
FROM Sales.Orders;
3. DATETRUNC β Data Aggregation
Task 3 β Aggregate orders by year with DATETRUNC
Using DATETRUNC, aggregate orders from Sales.Orders by year (based on CreationTime) and return the truncated year and the count of orders per year.
π‘ Suggested Answers
SELECT
DATETRUNC(year, CreationTime) AS Creation,
COUNT(*) AS OrderCount
FROM Sales.Orders
GROUP BY DATETRUNC(year, CreationTime);
4. EOMONTH
Task 4 β Show end-of-month for each CreationTime
For each order, show OrderID, CreationTime, and the end of that month using EOMONTH(CreationTime).
π‘ Suggested Answers
SELECT
OrderID,
CreationTime,
EOMONTH(CreationTime) AS EndOfMonth
FROM Sales.Orders;
5. Date Parts | Use Cases
Task 5 β Orders per year
Count how many orders were placed each year using YEAR(OrderDate) and GROUP BY.
π‘ Suggested Answers
SELECT
YEAR(OrderDate) AS OrderYear,
COUNT(*) AS TotalOrders
FROM Sales.Orders
GROUP BY YEAR(OrderDate);
Task 6 β Orders per month (numeric month)
Count how many orders were placed each month using MONTH(OrderDate).
π‘ Suggested Answers
SELECT
MONTH(OrderDate) AS OrderMonth,
COUNT(*) AS TotalOrders
FROM Sales.Orders
GROUP BY MONTH(OrderDate);
Task 7 β Orders per month (friendly month names)
Count how many orders were placed each month, using DATENAME(month, OrderDate) to show the month name.
π‘ Suggested Answers
SELECT
DATENAME(month, OrderDate) AS OrderMonth,
COUNT(*) AS TotalOrders
FROM Sales.Orders
GROUP BY DATENAME(month, OrderDate);
Task 8 β Orders in February
Show all orders that were placed during the month of February, using MONTH(OrderDate).
π‘ Suggested Answers
SELECT
*
FROM Sales.Orders
WHERE MONTH(OrderDate) = 2;
6. FORMAT
Task 9 β Format CreationTime with various patterns
For each order, show OrderID, CreationTime, and formatted versions using FORMAT:
'MM-dd-yyyy'asUSA_Format'dd-MM-yyyy'asEURO_Format'dd','ddd','dddd','MM','MMM','MMMM'in separate columns
π‘ Suggested Answers
SELECT
OrderID,
CreationTime,
FORMAT(CreationTime, 'MM-dd-yyyy') AS USA_Format,
FORMAT(CreationTime, 'dd-MM-yyyy') AS EURO_Format,
FORMAT(CreationTime, 'dd') AS dd,
FORMAT(CreationTime, 'ddd') AS ddd,
FORMAT(CreationTime, 'dddd') AS dddd,
FORMAT(CreationTime, 'MM') AS MM,
FORMAT(CreationTime, 'MMM') AS MMM,
FORMAT(CreationTime, 'MMMM') AS MMMM
FROM Sales.Orders;
Task 10 β Custom formatted CreationTime
Display CreationTime in a custom string format like:
Day Wed Jan Q1 2025 12:34:56 PM
by combining FORMAT and DATENAME(quarter, ...).
π‘ Suggested Answers
SELECT
OrderID,
CreationTime,
'Day ' + FORMAT(CreationTime, 'ddd MMM') +
' Q' + DATENAME(quarter, CreationTime) + ' ' +
FORMAT(CreationTime, 'yyyy hh:mm:ss tt') AS CustomFormat
FROM Sales.Orders;
Task 11 β Orders per month-year (e.g., βJan 25β)
Using FORMAT(CreationTime, 'MMM yy'), count how many orders were placed for each "MMM yy" period.
π‘ Suggested Answers
SELECT
FORMAT(CreationTime, 'MMM yy') AS OrderDate,
COUNT(*) AS TotalOrders
FROM Sales.Orders
GROUP BY FORMAT(CreationTime, 'MMM yy');
7. CONVERT
Task 12 β Demonstrate CONVERT for dates and strings
Use CONVERT to:
- Convert
'123'toINT - Convert
'2025-08-20'toDATE - Convert
CreationTimetoDATE - Convert
CreationTimetoVARCHARwith two different styles (32 and 34)
π‘ Suggested Answers
SELECT
CONVERT(INT, '123') AS [String to Int CONVERT],
CONVERT(DATE, '2025-08-20') AS [String to Date CONVERT],
CreationTime,
CONVERT(DATE, CreationTime) AS [Datetime to Date CONVERT],
CONVERT(VARCHAR, CreationTime, 32) AS [USA Std. Style:32],
CONVERT(VARCHAR, CreationTime, 34) AS [EURO Std. Style:34]
FROM Sales.Orders;
8. CAST
Task 13 β Demonstrate CAST for type conversion
Using CAST, convert:
'123'toINT123toVARCHAR'2025-08-20'toDATEandDATETIME2CreationTimetoDATE
π‘ Suggested Answers
SELECT
CAST('123' AS INT) AS [String to Int],
CAST(123 AS VARCHAR) AS [Int to String],
CAST('2025-08-20' AS DATE) AS [String to Date],
CAST('2025-08-20' AS DATETIME2) AS [String to Datetime],
CreationTime,
CAST(CreationTime AS DATE) AS [Datetime to Date]
FROM Sales.Orders;
9. DATEADD / DATEDIFF
Task 14 β Date arithmetic on OrderDate
For each order, show:
OrderDateTenDaysBefore= 10 days beforeOrderDateThreeMonthsLater= 3 months afterOrderDateTwoYearsLater= 2 years afterOrderDate
using DATEADD.
π‘ Suggested Answers
SELECT
OrderID,
OrderDate,
DATEADD(day, -10, OrderDate) AS TenDaysBefore,
DATEADD(month, 3, OrderDate) AS ThreeMonthsLater,
DATEADD(year, 2, OrderDate) AS TwoYearsLater
FROM Sales.Orders;
Task 15 β Calculate employee age
Using DATEDIFF, calculate the age (in years) of employees based on BirthDate and current date from Sales.Employees.
π‘ Suggested Answers
SELECT
EmployeeID,
BirthDate,
DATEDIFF(year, BirthDate, GETDATE()) AS Age
FROM Sales.Employees;
Task 16 β Average shipping duration per month
From Sales.Orders, compute the average shipping duration in days for each month (based on OrderDate and ShipDate).
π‘ Suggested Answers
SELECT
MONTH(OrderDate) AS OrderMonth,
AVG(DATEDIFF(day, OrderDate, ShipDate)) AS AvgShip
FROM Sales.Orders
GROUP BY MONTH(OrderDate);
Task 17 β Time gap between consecutive orders
Using DATEDIFF and LAG, compute for each order:
CurrentOrderDatePreviousOrderDateNrOfDays= number of days between the previous order and the current one
π‘ Suggested Answers
SELECT
OrderID,
OrderDate AS CurrentOrderDate,
LAG(OrderDate) OVER (ORDER BY OrderDate) AS PreviousOrderDate,
DATEDIFF(day, LAG(OrderDate) OVER (ORDER BY OrderDate), OrderDate) AS NrOfDays
FROM Sales.Orders;
10. ISDATE
Task 18 β Validate dates and convert valid ones
Given a derived table with several OrderDate strings, use ISDATE to:
- Show whether each string is a valid date (
IsValidDate) - Convert valid values to
DATEand otherwise set them to'9999-01-01'inNewOrderDate
(Optionally, you can filter only invalid rows using the commented WHERE.)
π‘ Suggested Answers
SELECT
OrderDate,
ISDATE(OrderDate) AS IsValidDate,
CASE
WHEN ISDATE(OrderDate) = 1 THEN CAST(OrderDate AS DATE)
ELSE '9999-01-01'
END AS NewOrderDate
FROM (
SELECT '2025-08-20' AS OrderDate UNION
SELECT '2025-08-21' UNION
SELECT '2025-08-23' UNION
SELECT '2025-08'
) AS t
-- WHERE ISDATE(OrderDate) = 0